import { merge } from "lodash-es";

/** 获取路由自定义的，动态的props函数
 * @author 技术运维中心 阮中楠
 * @description
 * 这个函数会生成一个props，交付给对应的vue组件。实现路由传参。
 *
 * 专门针对于 routers.props 属性
 *
 * @param { import("vue-router").Route } route 路由对象 该值一般来自于 routers.props 属性提供的回调函数形参
 *
 * @param { string[] } [paramsNames=[]] 参数名称数组
 * 这里传递各种参数名称的字符串名
 *
 * 如 fuckerId userId mode 等变量名
 */
export function getRoutersProps(route, paramsNames = []) {
  /** 小的对象数组 */
  const objs = paramsNames.map((paramsName, indx, arr) => {
    /** 从路由的 query 对象内获取到的参数 */
    const queryVal = route.query?.[paramsName];

    /** 从路由的 params 对象内获取到的参数 */
    const paramsVal = route.params?.[paramsName];

    // 尽可能获取到参数 以query传递的参数为主
    // 有疑惑 遇到bug 无法使用有效的可选链操作符
    // let val = queryVal ?? paramsVal;
    let val = paramsVal;

    // 如果确实没有获取到参数 就标记为无参数 这些参数总是被默认格式化一次 格式化为字符串
    // 此处的格式化行为可以再被配置一次 可以拓展成完善的配置
    // 警告 该部分可能会引发字符串格式化的bug
    val = val === void 0 ? void 0 : "" + val;

    return { [paramsName]: val };
  });

  return merge({}, ...objs);
}

export function useRoutersProps() {
  return {
    getRoutersProps,
  };
}
